home *** CD-ROM | disk | FTP | other *** search
/ Workbench Add-On / Workbench Add-On - Volume 1.iso / Music / PLAY / MultiPlayer / MultiPlayer132Src.lha / npplay.asm < prev    next >
Assembly Source File  |  1992-09-14  |  11KB  |  448 lines

  1. * MultiPlayer
  2. * Copyright (C) 1992 Bryan Ford
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License as published by
  6. * the Free Software Foundation; either version 2 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. * GNU General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program; if not, write to the Free Software
  16. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17. *
  18. * I (the author of MultiPlayer) can be contacted on the Internet at
  19. * "bryan.ford@m.cc.utah.edu".  See "Player.doc" for other addresses.
  20. *
  21. * Note:  This playroutine was not originally written by me.  In general
  22. * these playroutines are public domain, so I am bringing the versions
  23. * modified for MultiPlayer under the General Public License.  In the
  24. * few cases of already-copyrighted playroutines, the above copyright
  25. * notice applies only to the parts of the file written by me.
  26. *
  27. * $Id: npplay.asm,v 4.2 92/06/21 11:13:34 BAF Exp Locker: BAF $
  28. *
  29.  
  30.         include "player.i"
  31.  
  32.         xref    modmem
  33.         xref    getfreqmodspeed,dmawait
  34.  
  35.         xdef    npstart
  36.  
  37.         code    text
  38.  
  39. npstart
  40.         plstartret 9$
  41.  
  42.         cnop    0,4
  43.         dc.l    gmod_Hook
  44. 9$      gmodnop
  45.         gmodbra np_init                 ; StartMusic
  46.         gmodnop
  47.         gmodnop
  48.         gmodnop
  49.         gmodq   1                       ; ContinueMusic
  50.         gmodnop
  51.         gmodnop
  52.         gmodnop
  53.         gmodnop
  54.         gmodnop
  55.         gmodnop
  56.         gmodnop
  57.         gmodnop                         ; GetSongName
  58.         gmodnop                         ; GetSongAuthor
  59.         gmodbra getfreqmodspeed         ; GetFrequency
  60.         gmodbra 1$                      ; TimerTick
  61.         lea     name(pc),a0             ; GetMakerName
  62.         move.l  a0,d0
  63.         rts
  64.  
  65. 1$      movem.l d2-d7/a2-a6,-(sp)
  66.         bsr     np_music
  67.         movem.l (sp)+,d2-d7/a2-a6
  68.         rts
  69.  
  70.  
  71. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  72. * NoisePacker V2.01 PlayRoutine ©1990 Twins of Phenomena. *
  73. * Used registers are d0-d7/a0-a6. It use lev6irq.         *
  74. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  75.  
  76. np_init
  77.         movem.l d2-d7/a2-a6,-(sp)
  78.         move.l  modmem,a4
  79.         lea     $dff000,a5
  80.         lea     np_position(pc),a6
  81.         moveq   #2,d0
  82.         moveq   #0,d1
  83.         move.l  a4,a3
  84. np_init1
  85.         add     (a4)+,a3
  86.         move.l  a3,(a6)+
  87.         dbf     d0,np_init1
  88.         move    (a4)+,d0
  89.         add.l   d0,a3
  90.         move.l  #$01060100,(a6)+
  91.         move    #$8200,(a6)+
  92.         move.l  d1,(a6)+
  93.         move.l  #np_portup,(a6)+
  94.         move.l  #np_portdown,(a6)+
  95.         move.l  #np_port,(a6)+
  96.         move.l  #np_vib,(a6)+
  97.         move.l  #np_port2,(a6)+
  98.         move.l  #np_vib2,(a6)+
  99.         move.l  #np_volslide,(a6)+
  100.         move.l  #np_arp,(a6)+
  101.         move.l  #np_songjmp,(a6)+
  102.         move.l  #np_setvol,(a6)+
  103.         move.l  #np_pattbreak,(a6)+
  104.         move.l  #np_filter,(a6)+
  105.         move.l  #np_setspeed,(a6)+
  106.         moveq   #0,d0
  107.         move.l  a4,a6
  108.         add     -8(a4),a6
  109.         sub     #12,a6
  110. np_init2
  111.         move.l  a3,(a4)
  112.         move.l  a3,a2
  113.         move    14(a4),d0
  114.         add     d0,d0
  115.         add.l   d0,a2
  116.         move.l  a2,8(a4)
  117.         move    4(a4),d0
  118.         add     d0,d0
  119.         add.l   d0,a3
  120.         add     #16,a4
  121.         cmp.l   a4,a6
  122.         bne.s   np_init2
  123.         bset    #1,$bfe001
  124.         move    d1,$a8(a5)
  125.         move    d1,$b8(a5)
  126.         move    d1,$c8(a5)
  127.         move    d1,$d8(a5)
  128.         movem.l (sp)+,d2-d7/a2-a6
  129.         rts
  130.  
  131. np_music
  132.         moveq   #0,d6
  133.         lea     $dff0d0,a4
  134.         lea     np_block(pc),a6
  135.         subq.b  #1,(a6)
  136.         bhi     np_nonew
  137.         lea     np_position(pc),a3
  138.         move.l  (a3)+,a0
  139.         add     6(a6),a0
  140.         move    (a0),d0
  141.         move.l  (a3)+,a0
  142.         add     d0,a0
  143.         move.l  (a3)+,a1
  144.         add     8(a6),a1
  145.         lea     np_voidat1(pc),a2
  146.         moveq   #8,d0
  147.         moveq   #0,d5
  148. np_loop1
  149.         moveq   #0,d1
  150.         move    (a0)+,d1
  151.         lea     0(a1,d1.l),a3
  152.         move.b  (a3)+,d1
  153.         move.b  (a3)+,d3
  154.         move.b  (a3)+,d4
  155.         move.b  d3,d7
  156.         lsr.b   #4,d7
  157.         move.b  d1,d2
  158.         and     #1,d2
  159.         beq.s   np_loop2
  160.         moveq   #$10,d2
  161. np_loop2
  162.         move.l  modmem,a3
  163.         subq    #8,a3
  164.         or.b    d7,d2
  165.         bne.s   np_loop3
  166.         move.b  1(a2),d2
  167.         lsl     #4,d2
  168.         add     d2,a3
  169.         bra.s   np_loop4
  170. np_loop3
  171.         move.b  d2,1(a2)
  172.         lsl     #4,d2
  173.         add     d2,a3
  174.         move    6(a3),4(a2)
  175. np_loop4
  176.         and     #$f,d3
  177.         move.b  d3,2(a2)
  178.         move.b  d4,3(a2)
  179.         and     #$fe,d1
  180.         beq.s   np_loop5
  181.         move    np_periods-2(pc,d1.w),d7
  182.         subq    #3,d3
  183.         beq     np_setport
  184.         subq    #2,d3
  185.         beq     np_setport
  186.         or      d0,d5
  187.         move.b  d1,(a2)
  188.         move.b  d6,49(a2)
  189.         move    d7,24(a2)
  190.         move.l  (a3)+,(a4)
  191.         move    (a3)+,4(a4)
  192.         addq    #2,a3
  193.         move.l  (a3)+,72(a2)
  194.         move    (a3)+,76(a2)
  195.         subq    #6,d3
  196.         bmi.s   np_loop6
  197.         add     d3,d3
  198.         add     d3,d3
  199.         move.l  42(a6,d3.w),a3
  200.         jmp     (a3)
  201.  
  202. np_loop5
  203.         sub     #11,d3
  204.         bmi.s   np_loop6
  205.         add     d3,d3
  206.         add     d3,d3
  207.         move.l  42(a6,d3.w),a3
  208.         jmp     (a3)
  209.  
  210. np_periods
  211.         dc.w    $0358,$0328,$02fa,$02d0,$02a6,$0280,$025c,$023a,$021a
  212.         dc.w    $01fc,$01e0,$01c5,$01ac,$0194,$017d,$0168,$0153,$0140
  213.         dc.w    $012e,$011d,$010d,$00fe,$00f0,$00e2,$00d6,$00ca,$00be
  214.         dc.w    $00b4,$00aa,$00a0,$0097,$008f,$0087,$007f,$0078,$0071
  215.  
  216. np_loop6
  217.         move    24(a2),6(a4)
  218. np_loop7
  219.         move    4(a2),8(a4)
  220.         addq    #6,a2
  221.         sub     #$10,a4
  222.         lsr     #1,d0
  223.         bne     np_loop1
  224.         move    d5,$dff096
  225.         move.b  d5,5(a6)
  226.         move.b  1(a6),(a6)
  227.  
  228.         jsr     dmawait
  229.  
  230.         move    np_block+4(pc),$dff096
  231.  
  232.         jsr     dmawait
  233.  
  234.         lea     np_voidat2(pc),a0
  235.         move.l  (a0)+,$dff0d0
  236.         move    (a0)+,$dff0d4
  237.         move.l  (a0)+,$dff0c0
  238.         move    (a0)+,$dff0c4
  239.         move.l  (a0)+,$dff0b0
  240.         move    (a0)+,$dff0b4
  241.         move.l  (a0)+,$dff0a0
  242.         move    (a0)+,$dff0a4
  243.  
  244.         move.l  np_position(pc),a0
  245.         bset    #0,2(a6)
  246.         beq.s   np_break
  247.         addq    #3,8(a6)
  248.         cmp     #192,8(a6)
  249.         bne.s   np_next
  250. np_break
  251.         move    d6,8(a6)
  252.         addq    #2,6(a6)
  253.         move    6(a6),d0
  254.         cmp     -4(a0),d0
  255.         bne.s   np_next
  256.         move    -2(a0),6(a6)
  257. np_next rts
  258.  
  259. np_setvol
  260.         move.b  d4,5(a2)
  261.         bra     np_loop6
  262.  
  263. np_pattbreak
  264.         move    d6,2(a6)
  265.         bra     np_loop6
  266.  
  267. np_songjmp
  268.         move    d6,2(a6)
  269.         move.b  d4,7(a6)
  270.         bra     np_loop6
  271.  
  272. np_setspeed
  273.         move.b  d4,1(a6)
  274.         bra     np_loop6
  275.  
  276. np_filter
  277.         and.b   #$fd,$bfe001
  278.         or.b    d4,$bfe001
  279.         bra     np_loop6
  280.  
  281. np_setport
  282.         move.b  d6,50(a2)
  283.         move    d7,26(a2)
  284.         cmp     24(a2),d7
  285.         beq.s   np_clrport
  286.         bge     np_loop7
  287.         move.b  #1,50(a2)
  288.         bra     np_loop7
  289. np_clrport
  290.         move    d6,26(a2)
  291.         bra     np_loop7
  292.  
  293. np_nonew
  294.         lea     np_voidat1(pc),a0
  295.         moveq   #3,d0
  296. np_lop1 moveq   #0,d1
  297.         move.b  2(a0),d1
  298.         beq.s   np_lop2
  299.         subq    #8,d1
  300.         bhi.s   np_lop2
  301.         addq    #7,d1
  302.         add     d1,d1
  303.         add     d1,d1
  304.         move.l  10(a6,d1.w),a3
  305.         jmp     (a3)
  306. np_lop2 addq    #6,a0
  307.         sub     #$10,a4
  308.         dbf     d0,np_lop1
  309.         rts
  310.  
  311. np_portup
  312.         moveq   #0,d2
  313.         move.b  3(a0),d2
  314.         sub     d2,24(a0)
  315.         cmp     #$71,24(a0)
  316.         bpl.s   np_portup2
  317.         move    #$71,24(a0)
  318. np_portup2
  319.         move    24(a0),6(a4)
  320.         bra.s   np_lop2
  321.  
  322. np_portdown
  323.         moveq   #0,d2
  324.         move.b  3(a0),d2
  325.         add     d2,24(a0)
  326.         cmp     #$358,24(a0)
  327.         bmi.s   np_portdown2
  328.         move    #$358,24(a0)
  329. np_portdown2
  330.         move    24(a0),6(a4)
  331.         bra.s   np_lop2
  332.  
  333. np_arp  moveq   #0,d2
  334.         move.b  (a6),d2
  335.         sub.b   1(a6),d2
  336.         neg.b   d2
  337.         move.b  np_arplist(pc,d2.w),d2
  338.         beq.s   np_arp0
  339.         subq.b  #2,d2
  340.         beq.s   np_arp2
  341. np_arp1 move.b  3(a0),d2
  342.         lsr     #3,d2
  343.         and     #$e,d2
  344.         bra.s   np_arp3
  345. np_arp2 move.b  3(a0),d2
  346.         and     #$f,d2
  347.         add     d2,d2
  348. np_arp3 add.b   (a0),d2
  349.         cmp     #$48,d2
  350.         bls.s   np_arp4
  351.         moveq   #$48,d2
  352. np_arp4 lea     np_periods-2(pc),a3
  353.         move    0(a3,d2.w),6(a4)
  354.         bra     np_lop2
  355. np_arp0 move    24(a0),6(a4)
  356.         bra     np_lop2
  357.  
  358. np_arplist
  359.         dc.b 0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1
  360.  
  361. np_sin
  362.         dc.b $00,$18,$31,$4a,$61,$78,$8d,$a1,$b4,$c5,$d4,$e0,$eb,$f4,$fa,$fd
  363.         dc.b $ff,$fd,$fa,$f4,$eb,$e0,$d4,$c5,$b4,$a1,$8d,$78,$61,$4a,$31,$18
  364.  
  365. np_vib  move.b  3(a0),d3
  366.         beq.s   np_vib2
  367.         move.b  d3,48(a0)
  368. np_vib2
  369.         move.b  49(a0),d3
  370.         lsr.b   #2,d3
  371.         and     #$1f,d3
  372.         moveq   #0,d2
  373.         move.b  np_sin(pc,d3.w),d2
  374.         move.b  48(a0),d3
  375.         and     #$f,d3
  376.         mulu    d3,d2
  377.         lsr     #7,d2
  378.         move    24(a0),d3
  379.         tst.b   49(a0)
  380.         bmi.s   np_vibsub
  381.         add     d2,d3
  382.         bra.s   np_vib3
  383. np_vibsub
  384.         sub     d2,d3
  385. np_vib3 move    d3,6(a4)
  386.         move.b  48(a0),d3
  387.         lsr.b   #2,d3
  388.         and     #$3c,d3
  389.         add.b   d3,49(a0)
  390.         cmp.b   #20,d1
  391.         bne     np_lop2
  392.  
  393. np_volslide
  394.         move.b  3(a0),d2
  395.         add.b   d2,5(a0)
  396.         bmi.s   np_vol3
  397.         cmp.b   #$40,5(a0)
  398.         bmi.s   np_vol2
  399.         move    #$40,4(a0)
  400. np_vol2 move    4(a0),8(a4)
  401.         bra     np_lop2
  402.  
  403. np_vol3 move    d6,4(a0)
  404.         move    4(a0),8(a4)
  405.         bra     np_lop2
  406.  
  407. np_port move.b  3(a0),d2
  408.         beq.s   np_port2
  409.         move.b  d2,29(a0)
  410.  
  411. np_port2
  412.         move    26(a0),d2
  413.         beq.s   np_rts
  414.         move    28(a0),d3
  415.         tst.b   50(a0)
  416.         bne.s   np_sub
  417.         add     d3,24(a0)
  418.         cmp     24(a0),d2
  419.         bgt.s   np_portok
  420.         move    d2,24(a0)
  421.         move    d6,26(a0)
  422. np_portok
  423.         move    24(a0),6(a4)
  424. np_rts  cmp.b   #16,d1
  425.         beq.s   np_volslide
  426.         bra     np_lop2
  427.  
  428. np_sub  sub     d3,24(a0)
  429.         cmp     24(a0),d2
  430.         blt.s   np_portok
  431.         move    d2,24(a0)
  432.         move    d6,26(a0)
  433.         move    24(a0),6(a4)
  434.         cmp.b   #16,d1
  435.         beq     np_volslide
  436.         bra     np_lop2
  437.  
  438. np_position     dc.l    0
  439. np_pattern      dc.l    0
  440. np_voice        dc.l    0
  441. np_block        ds.w    31
  442. np_voidat1      ds.l    18
  443. np_voidat2      ds.l    6
  444.  
  445. name    dc.b    "NoisePacker 2.01",0
  446.  
  447.         end
  448.